package com.qfmy.core.aop;

import com.qfmy.core.pojo.entity.ErrorCode;
import com.qfmy.core.pojo.entity.ResultMessage;
import com.qfmy.core.pojo.exception.CustomException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Objects;

/**
 * @ClassName: GlobalExceptionHandler
 * @author： zhengjt
 * @data： 2022/8/25 19:46
 * @version：1.0
 * @描述： 全局异常捕捉类，用来捕获全局异常
 */
@Component
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获自定义异常
     * @param e 自定义异常
     * @return  返回信息
     */
    @ExceptionHandler(CustomException.class)
    public ResultMessage customExceptionHandler(CustomException e){
        log.error("全局拦截异常 |  捕获自定义异常 ：\n {}", e.getErrorCode());
        return getResult(e);
    }

    /**
     * 捕获全局异常
     * @param e 异常信息
     * @return  返回信息
     */
    @ExceptionHandler(Exception.class)
    public ResultMessage allExceptionHandler(Exception e){
        //  判断当前异常是否是自定义异常
        if (e instanceof CustomException){
            return getResult((CustomException) e);
        }
        //  非自定义异常，为系统异常
        log.error("全局拦截异常 | 系统发生未知异常 ： " + e.getMessage());
        //  返回给前端，统一定义为系统未知异常
        ErrorCode errorCode = ErrorCode.ERROR_UNKNOWN;
        Integer code = errorCode.getCode();
        String message = errorCode.getMessage();
        return new ResultMessage(false,code,message);
    }

    /**
     * 自定义异常返回信息
     * @param e 自定义异常
     * @return  返回数据
     */
    private ResultMessage getResult(CustomException e){
        ErrorCode errorCode = e.getErrorCode();
        if (Objects.nonNull(errorCode)){
            Integer code = errorCode.getCode();
            String message = errorCode.getMessage();
            log.error("自定义异常信息 ： " + message);
            return new ResultMessage(false,code,message);
        }else {
            log.error(" ===== 异常消息为空 ===== ");
            errorCode = ErrorCode.ERROR_UNKNOWN;
            Integer code = errorCode.getCode();
            String message = errorCode.getMessage();
            return new ResultMessage(false,code,message);
        }
    }
}
